package com.yupi.yuaiagent.rag;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.yupi.yuaiagent.config.BaiduTranslateConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

/**
 * 百度翻译服务类
 * 使用百度翻译API进行文本翻译，成本比大模型翻译低很多
 */
@Slf4j
@Service
public class BaiduTranslateService {

    // 百度翻译API地址
    private static final String BAIDU_TRANSLATE_URL = "https://fanyi-api.baidu.com/api/trans/vip/translate";

    @Autowired
    private BaiduTranslateConfig config;

    /**
     * 翻译文本
     * @param text 要翻译的文本
     * @param from 源语言（如：auto, zh, en）
     * @param to 目标语言（如：zh, en）
     * @return 翻译后的文本
     */
    public String translate(String text, String from, String to) {
        if (text == null || text.trim().isEmpty()) {
            return text;
        }

        // 如果没有配置百度翻译API，直接返回原文
        if (config.getAppId() == null || config.getAppId().trim().isEmpty() ||
            config.getAppKey() == null || config.getAppKey().trim().isEmpty()) {
            log.warn("百度翻译API未配置，直接返回原文");
            return text;
        }

        try {
            // 生成随机盐值
            String salt = String.valueOf(System.currentTimeMillis());
            
            // 生成签名
            String sign = generateSign(text, salt, config.getAppId(), config.getAppKey());
            
            // 构建请求参数
            Map<String, Object> params = new HashMap<>();
            params.put("q", text);
            params.put("from", from);
            params.put("to", to);
            params.put("appid", config.getAppId());
            params.put("salt", salt);
            params.put("sign", sign);
            
            // 发送请求
            String response = HttpUtil.get(BAIDU_TRANSLATE_URL, params);
            log.debug("百度翻译API响应: {}", response);
            
            // 解析响应
            JSONObject jsonObject = JSONUtil.parseObj(response);
            
            // 检查错误码
            if (jsonObject.containsKey("error_code")) {
                String errorCode = jsonObject.getStr("error_code");
                String errorMsg = jsonObject.getStr("error_msg", "未知错误");
                log.error("百度翻译API错误 - 错误码: {}, 错误信息: {}", errorCode, errorMsg);
                return text; // 出错时返回原文
            }
            
            // 获取翻译结果
            JSONArray transResult = jsonObject.getJSONArray("trans_result");
            if (transResult != null && !transResult.isEmpty()) {
                StringBuilder result = new StringBuilder();
                for (int i = 0; i < transResult.size(); i++) {
                    JSONObject trans = transResult.getJSONObject(i);
                    result.append(trans.getStr("dst", ""));
                    if (i < transResult.size() - 1) {
                        result.append("\n");
                    }
                }
                return result.toString();
            }
            
            return text;
            
        } catch (Exception e) {
            log.error("调用百度翻译API失败", e);
            return text; // 出错时返回原文
        }
    }

    /**
     * 生成签名
     * @param text 要翻译的文本
     * @param salt 盐值
     * @return 签名
     */
    private String generateSign(String text, String salt, String appId, String appKey) {
        String str = appId + text + salt + appKey;
        return md5(str);
    }

    /**
     * MD5加密
     * @param input 输入字符串
     * @return MD5哈希值
     */
    private String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : digest) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            log.error("MD5加密失败", e);
            return "";
        }
    }

    /**
     * 智能翻译（自动检测语言）
     * @param text 要翻译的文本
     * @param targetLang 目标语言
     * @return 翻译后的文本
     */
    public String smartTranslate(String text, String targetLang) {
        return translate(text, "auto", targetLang);
    }

    /**
     * 中文翻译成英文
     * @param text 中文文本
     * @return 英文翻译
     */
    public String zhToEn(String text) {
        return translate(text, "zh", "en");
    }

    /**
     * 英文翻译成中文
     * @param text 英文文本
     * @return 中文翻译
     */
    public String enToZh(String text) {
        return translate(text, "en", "zh");
    }
}